// 8.字符串转换整数
// https://leetcode.cn/problems/string-to-integer-atoi/

/*
示例 1：

输入：s = "42"
输出：42
解释：加粗的字符串为已经读入的字符，插入符号是当前读取的字符。
第 1 步："42"（当前没有读入字符，因为没有前导空格）
         ^
第 2 步："42"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）
         ^
第 3 步："42"（读入 "42"）
           ^
解析得到整数 42 。
由于 "42" 在范围 [-231, 231 - 1] 内，最终结果为 42 。
示例 2：

输入：s = "   -42"
输出：-42
解释：
第 1 步："   -42"（读入前导空格，但忽视掉）
            ^
第 2 步："   -42"（读入 '-' 字符，所以结果应该是负数）
             ^
第 3 步："   -42"（读入 "42"）
               ^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内，最终结果为 -42 。
示例 3：

输入：s = "4193 with words"
输出：4193
解释：
第 1 步："4193 with words"（当前没有读入字符，因为没有前导空格）
         ^
第 2 步："4193 with words"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）
         ^
第 3 步："4193 with words"（读入 "4193"；由于下一个字符不是一个数字，所以读入停止）
             ^
解析得到整数 4193 。
由于 "4193" 在范围 [-231, 231 - 1] 内，最终结果为 4193 。
*/

/**
 * @param {string} s
 * @return {number}
 */
var myAtoi = function(s) {
	const trimS = s.trim();
	if (trimS.length < 1) return trimS;

	const MIN = -1 * (2 ** 31);
	const MAX = 2 ** 31 - 1;
	// 确认符号
	let atoi = '';
	const arr = [...trimS];

	for (let i = 0; i < arr.length; i++) {
		let char = arr[i]
		if (i === 0) {
			if (char === '+')
				continue;
			else if (char === '-') {
				atoi = '-';
				continue;
			}
		}

		if (char >= '0' && char <= '9') {
			atoi += char;
		} else {
			break;
		}
	}

	atoi = parseInt(atoi);

	if (isNaN(atoi)) return 0;

	if (atoi < MIN) return MIN;
	if (atoi > MAX) return MAX;
	return atoi;
};

function test(s) {
	let res = myAtoi(s);
	console.log(`${s} is ${res}`);
}

test(""); // 0
test("1"); // 0
test("42"); // 42
test("   -42"); // -42
test("4193 with words"); // 4193
test("2147483648") // 2147483647
test("2147483647") // 2147483647
test("-2147483648") // -2147483648
test("-2147483649") // -2147483648
test("words and 987") // 0
test("-words and 987") // 0